﻿using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Text;
using System.Text.RegularExpressions;

namespace Common.Util
{
    public class Regexlib
    {
        public Regexlib()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        }

        // 验证输入字符串为传真号码
        public static bool validateFax(string P_str_fax)
        {
            return Regex.IsMatch(P_str_fax, @"86-\d{2,3}-\d{7,8}");
        }

        // 验证中文
        public static bool IsChinese(string s)
        {
            char[] char_s = s.ToCharArray();
            for (int i = 0; i < char_s.Length; i++)
            {
                Regex rx = new Regex("^[\u4e00-\u9fa5]$");
                if (rx.IsMatch(char_s[i].ToString()))
                {
                    continue;
                }
                else { return false; }
            }
            return true;
        }

        // 验证网址
        public static bool IsWebAddress(string str)
        {
            return Regex.IsMatch(str, @"http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?");
        }

        // 验证Email
        public static bool EmailReg(string email)
        {
            return Regex.IsMatch(email, @"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*");
        }


        // 验证邮编
        public static bool PostReg(string post)
        {
            bool bl = false; ;
            //验证邮政编码
            string Reg = @"^\d{6}$";
            if (post != "")
            {
                if (Regex.IsMatch(post, Reg))
                {
                    bl = true;
                }
                else
                {
                    bl = false;
                }
            }
            return bl;
        }

        // 验证IP
        public static bool IsValidIp(string strIn)
        {
            return Regex.IsMatch(strIn, @"^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$");
        }

        // 验证图片
        public static bool IsValidPostfix(string strIn)
        {
            return Regex.IsMatch(strIn, @"\.(?i:gif|jpg|png|bmp|ico)$");
        }

        // 验证手机
        public static bool IsMobile(string val)
        {
            return Regex.IsMatch(val, @"^1[358]\d{9}$", RegexOptions.IgnoreCase);
        }

        // 验证电话
        public static bool TelReg(string tel)
        {
            bool bl = false; ;
            //验证电话
            //电话号码规则：
            //区号：3或者4位 
            //主号码：7或者8位
            //Reg = @"^((\(\d{3}\)|\d{3}-|\s)?\d{8})$";

            //加强版本的电话号码验证---支持非北京地区用户
            string Reg = @"^((\(\d{3}\)|\d{3}-|\d{3}|\(\d{4}\)|\d{4}-|\d{4}|\s)?(\d{8}|\d{7}))$";
            if (tel != "")
            {
                if (Regex.IsMatch(tel, Reg))
                {
                    bl = true;
                }
                else
                {
                    bl = false;
                }
            }
            else
            {
                bl = true;
            }
            return bl;
        }

        // 验证手机号（联通，移动）
        public static int ValidateMobile(string strMobile)
        {
            int iType = 0;
            if (strMobile.Substring(1, 2) == "3")//判断手机号第二位
            {
                //判断第三位
                if (int.Parse(strMobile.Substring(2, 3)) > 3)//移动
                {
                    iType = 1;
                }
            }
            if (strMobile.Substring(1, 2) == "5")//移动
            {
                if (int.Parse(strMobile.Substring(2, 3)) != 3)//移动
                {
                    iType = 1;
                }
                else
                {
                    iType = 0;//联通
                }
            }
            return iType;
        }

        // 验证年月日。验证日期格式为YYYY-MM-DD 或者 YYYY-M-d的正则表达式为：
        public static bool IsValidDate(string strIn)
        {
            //return Regex.IsMatch(strIn, @"(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)");
            /*
             * 暂目前比较好用的验证日期格式的正则表达式
             * 2012-1-1
             * 2012-01-01 包含闰年和平年 2月份天数
            */
            return Regex.IsMatch(strIn, @"(((^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(10|12|0?[13578])([-\/\._])(3[01]|[12][0-9]|0?[1-9]))|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(11|0?[469])([-\/\._])(30|[12][0-9]|0?[1-9]))|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(0?2)([-\/\._])(2[0-8]|1[0-9]|0?[1-9]))|(^([2468][048]00)([-\/\._])(0?2)([-\/\._])(29))|(^([3579][26]00)([-\/\._])(0?2)([-\/\._])(29))|(^([1][89][0][48])([-\/\._])(0?2)([-\/\._])(29))|(^([2-9][0-9][0][48])([-\/\._])(0?2)([-\/\._])(29))|(^([1][89][2468][048])([-\/\._])(0?2)([-\/\._])(29))|(^([2-9][0-9][2468][048])([-\/\._])(0?2)([-\/\._])(29))|(^([1][89][13579][26])([-\/\._])(0?2)([-\/\._])(29))|(^([2-9][0-9][13579][26])([-\/\._])(0?2)([-\/\._])(29)))((\s+(0?[1-9]|1[012])(:[0-5]\d){0,2}(\s[AP]M))?$|(\s+([01]\d|2[0-3])(:[0-5]\d){0,2})?$))");
        }

        // 验证HH:MM(6:30)
        public static bool HHMM(String input)
        {
            return Regex.IsMatch(input, @"^(?:(?:[0-2][0-3])|(?:[0-1][0-9])):[0-5][0-9]$");
        }

        // 验证数值类型
        public static bool NumCheck(string strIn)
        {
            return !Regex.IsMatch(strIn, "[^\\d.]");
        }

        // 验证数值类型[整数]
        public static bool NumCheck_Int(string strIn)
        {
            return (Regex.IsMatch(strIn, "^((\\+|-)\\d)?\\d*$"));
        }

        // 验证数值类型[正整数]
        public static bool NumCheck_UInt(string strIn)
        {
            if (Regex.IsMatch(strIn, "^((\\+|-)\\d)?\\d*$"))
            {
                if (int.Parse(strIn) > 0)
                    return true;
            }
            return false;
        }

        // 验证数值类型[正数]
        public static bool NumCheck_UInt(double strIn)
        {
            if (strIn > 0)
            {
                return true;
            }
            return false;
        }

        // 验证数值类型[小数]
        public static bool IsValidDecimal(string strIn)
        {
            return Regex.IsMatch(strIn, @"[0].\d{1,2}|[1]");
        }

        // 验证数值类型[float]
        public static bool IsValidFloat(string strIn)
        {
            //			return Regex.IsMatch(strIn,"^(?:\\+|-)?\\d+(?:\\.\\d+)?$"); 
            if (false == Regex.IsMatch(strIn, "^(?:\\+|-)?\\d+(?:\\.\\d+)?$"))
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        // 验证数值类型[正符点数]
        public static bool IsValidUFloat(string strIn)
        {
            //			return Regex.IsMatch(strIn,"^(?:\\+|-)?\\d+(?:\\.\\d+)?$"); 
            if (false == Regex.IsMatch(strIn, "^(?:\\+|-)?\\d+(?:\\.\\d+)?$"))
            {
                return false;
            }
            else
            {
                return (Convert.ToSingle(strIn) < 0) ? false : true;
            }
        }

        // 验证字符是否在4至16之间。
        public static bool IsValidByte(string strIn)
        {
            return Regex.IsMatch(strIn, @"^[\w]{4,16}$");
        }

        /// <summary>
        /// 根据指定标签获取标签之间的文本
        /// </summary>
        /// <param name="tag">指定标签 如：<XXXX>*******</XXXX> 中的 XXXX  </param>
        /// <param name="content">获取标签之间的文本</param>
        /// <returns>String</returns>
        public static string GetStrByTag(string tag, string content)
        {
            if (!string.IsNullOrEmpty(content))
            {
                StringBuilder sbstr = new StringBuilder();
                string strRef = @"(?<=\<" + tag + @".*\>)[^\<\>]*(?=\</" + tag + @"\>)";
                MatchCollection matches = new Regex(strRef).Matches(content);
                if (matches != null && matches.Count > 0)
                {
                    for (int i = 0; i < matches.Count; i++)
                    {
                        sbstr.Append(matches[i].ToString());
                    }
                }
                return sbstr.ToString();
            }
            else
            {
                return "NONE";
            }
        }
    }
}